package pe.edu.upc.dsd.qwerty.wsreserva.util.bean;

import java.util.Properties;
import java.util.logging.Level;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import pe.edu.upc.dsd.qwerty.wsreserva.model.Asiento;
import pe.edu.upc.dsd.qwerty.wsreserva.model.Vuelo;

/**
 * Clase encargada de realizar el envio de mails.
 * @author elvis
 */
@Component
public class MailService {
	
	private static final Logger logger = Logger.getLogger(MailService.class);
	private static final String SERVER = "smtp.gmail.com";
    private static final String SERVER_PORT = "587";//"465";
	private static final String SENDER = "lekvispk@gmail.com";
	private static final String USER_SENDER = "lekvispk";
	private static final String USER_PASSWORD = "000";
	private static final String IP = "localhost:8080";//64.76.72.75
        
	private String estilo = "<style type='text/css'> " +
			"body{background-color: #F9F9F9;} " +
			"table{font-size: 11px; font-family: arial;} " +
			"table th{font-size: 14px; background-color: #142733; color: #FFFFFF;} " +
			"table td{ background-color: #F9F9F9;} " +
			" " +
			"td.rojo{ background-color: #E60000;	}	" +
			"td.verde { background-color: #367D37;	}	" +
			"td.amarillo{ background-color: #FFF334;	color: #000;}" +
			" " +
			"table .tform{font-size: 11px; font-family: arial; background-color:#F9F9F9;}  " +
			".tform th{font-size: 12px;  color: #993333; text-align:right; background-color: #F9F9F9;} " +
			".tform td{ }  " +
			" " +
			"</style>";
	private String pie = "<tr><td  align=\"center\"> <br/>******Este mensaje ha sido enviado desde una cuenta desatendida, por favor no responder a este correo****** </td></tr>";
    
    public Properties obtenerProperties(){
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", SERVER);//smtp.gmail.com//MTCLPCC-ML05
        props.setProperty("mail.smtp.starttls.enable", "true");
        props.setProperty("mail.smtp.port", SERVER_PORT);//587//25
        props.setProperty("mail.smtp.user", SENDER);//ecampos@mintc.gob.pe//alertas_system@mtc.gob.pe
        props.setProperty("mail.smtp.auth", "true");
        return props;
    }
    
    public void enviaMensaje(String destinatario, Asiento asiento , Vuelo vuelo) {
        try {
        	         
            StringBuilder mensajeAdministrado = new StringBuilder();
            mensajeAdministrado.append(estilo);
            mensajeAdministrado.append("<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"700px\" align=\"center\"> ");
            mensajeAdministrado.append("<tr><td>");
            mensajeAdministrado.append("<BR>Buenos dias, usted ha realizado la reserva siguiente <br>");
            mensajeAdministrado.append("</td></tr>");
            mensajeAdministrado.append("<tr><td>");
            mensajeAdministrado.append("Vuelo : " + vuelo.getAerolinea() + " " + vuelo.getCodigoVuelo() + " Asiento " + asiento.getNumero() );
            mensajeAdministrado.append("</td></tr>");            
            mensajeAdministrado.append("<tr><td>");
            mensajeAdministrado.append("<BR> De clic en el siguiente enlace para confirmar la reserva ");
            mensajeAdministrado.append("<a href='http://").append(IP).append("/wsreserva/services/rest/vuelos/"+ asiento.getIdVuelo()+"/asientos/"+asiento.getIdAsiento()+"/confirm/"+asiento.getUuid()+"'> Confirmar </a><br>");
            mensajeAdministrado.append("</td></tr>");
            mensajeAdministrado.append("<tr><td><br/>");
            mensajeAdministrado.append("</td></tr>");
            mensajeAdministrado.append(pie);
            mensajeAdministrado.append("</table>");
            
            enviarMail(SERVER, SERVER_PORT, "Reserva de Asiento", SENDER , mensajeAdministrado.toString() , destinatario);
        
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void enviarMail(String mailhost, String port, String subject, String from, String body, String... to){
        try {
         
            Properties props = new Properties();
            props.setProperty("mail.smtp.host", mailhost);
            props.setProperty("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.port", port);
            props.setProperty("mail.smtp.user", from);
            props.setProperty("mail.smtp.auth", "true");
            
            Authenticator auth = new autentificadorSMTP();
            Session session = Session.getDefaultInstance(props,auth);   
            session.setDebug(false);
            MimeMessage message = new MimeMessage(session);        
            message.setFrom(new InternetAddress(from));
            message.setSubject(subject);  
            if(to != null)
        	for(String para : to){
        		message.addRecipient(Message.RecipientType.TO,new InternetAddress(para));            		
        	}
            message.setText(body,"UTF-8","html");
            
            Transport.send(message, message.getAllRecipients());
            logger.debug("mensaje enviado");
           
        } catch (MessagingException ex) {
            java.util.logging.Logger.getLogger(MailService.class.getName()).log(Level.SEVERE, null, ex);
        }catch(Exception e){
        	e.printStackTrace();
        }
    
    }
    
    private class autentificadorSMTP extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(USER_SENDER, USER_PASSWORD);
        }
    }

	public void enviaMensajeConfirmado(String destinatario, Asiento asiento, Vuelo vuelo) {
		 try {
	         
	            StringBuilder mensajeAdministrado = new StringBuilder();
	            mensajeAdministrado.append(estilo);
	            mensajeAdministrado.append("<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"700px\" align=\"center\"> ");
	            mensajeAdministrado.append("<tr><td>");
	            mensajeAdministrado.append("<BR>Buenos dias, la siguiente reserva ha sido confirmada <br>");
	            mensajeAdministrado.append("</td></tr>");
	            mensajeAdministrado.append("<tr><td>");
	            mensajeAdministrado.append("Vuelo : " + vuelo.getAerolinea() + " " + vuelo.getCodigoVuelo() + " Asiento " + asiento.getNumero() );
	            mensajeAdministrado.append("</td></tr>");            
	            mensajeAdministrado.append("<tr><td>");
	            mensajeAdministrado.append("Buen viaje");
	            mensajeAdministrado.append("</td></tr>");
	            mensajeAdministrado.append("<tr><td>");
	            
	            mensajeAdministrado.append("</td></tr>");
	            mensajeAdministrado.append(pie);
	            mensajeAdministrado.append("</table>");
	            
	            enviarMail(SERVER, SERVER_PORT, "Reserva de Asiento", SENDER , mensajeAdministrado.toString() , destinatario);
	        
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	}
 
}